home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / blankery / blanker / source / blankers / moire / blank.c next >
C/C++ Source or Header  |  1993-08-15  |  6KB  |  227 lines

  1. /*
  2.  *    Copyright (c) 1993 Michael D. Bayne.
  3.  *    All rights reserved.
  4.  *
  5.  *    Please see the documentation accompanying the distribution for distribution and disclaimer information.
  6.  */
  7.  
  8. #include <exec/types.h>
  9. #include <exec/memory.h>
  10.  
  11. #include <intuition/intuition.h>
  12. #include <intuition/screens.h>
  13.  
  14. #include <dos/dos.h>
  15.  
  16. #include <graphics/gfxbase.h>
  17. #include <graphics/gfxmacros.h>
  18. #include <graphics/copper.h>
  19. #include <graphics/videocontrol.h>
  20. #include <hardware/custom.h>
  21.  
  22. #include <clib/exec_protos.h>
  23. #include <clib/intuition_protos.h>
  24. #include <clib/graphics_protos.h>
  25. #include <clib/alib_protos.h>
  26. #include <clib/utility_protos.h>
  27.  
  28. #include "Moire.h"
  29. #include "/defs.h"
  30. #include "/utility.h"
  31.  
  32. struct mPrefObject {
  33.     LONG xSpeed, ySpeed, Trail, numLines, Cycle;
  34. };
  35.  
  36. #pragma libcall GfxBase LoadRGB32 372 9802
  37.  
  38. extern    struct    mPrefObject    nP;
  39. extern        ULONG        Depth, Mode;
  40. extern        UBYTE        *prefData;
  41.  
  42. VOID agaInit( struct Screen *Screen, LONG numCols )
  43. {
  44.     ULONG *agaTable, i, tPos;
  45.  
  46.     agaTable = AllocVec(( numCols*3 + 2 )*sizeof( ULONG ), MEMF_CLEAR );
  47.  
  48.     agaTable[0] = ( numCols<<16 );
  49.     agaTable[1] = agaTable[2] = agaTable[3] = 0;
  50.     tPos = 3;
  51.     for( i = 1; i < numCols/3+1; ++i ) {
  52.         agaTable[++tPos] = (0xFFFFFF)|((numCols-3*i)<<24);
  53.         agaTable[++tPos] = (0xFFFFFF)|((3*i)<<24);
  54.         agaTable[++tPos] = (0xFFFFFF);
  55.     }
  56.     for( i = 1; i < numCols/3+1; ++i ) {
  57.         agaTable[++tPos] = (0xFFFFFF);
  58.         agaTable[++tPos] = (0xFFFFFF)|((numCols-3*i)<<24);
  59.         agaTable[++tPos] = (0xFFFFFF)|((3*i)<<24);
  60.     }
  61.     for( i = 1; i < numCols/3+1; ++i ) {
  62.         agaTable[++tPos] = (0xFFFFFF)|((3*i)<<24);
  63.         agaTable[++tPos] = (0xFFFFFF);
  64.         agaTable[++tPos] = (0xFFFFFF)|((numCols-3*i)<<24);
  65.     }
  66.     agaTable[++tPos] = 0;
  67.  
  68.     LoadRGB32( &(Screen->ViewPort), agaTable );
  69.  
  70.     FreeVec( agaTable );
  71. }
  72.  
  73. VOID ecsInit( struct Screen *Screen, LONG numCols )
  74. {
  75.     UWORD    Table6[] = { 0, 0x0F20, 0x0E30, 0x0C50, 0x0B60, 0x0980, 0x0890, 0x06B0,
  76.         0x05C0, 0x03E0, 0x02F0, 0x00F2, 0x00E3, 0x00C5, 0x00B6, 0x0098, 0x006B,
  77.         0x005C, 0x003E, 0x002F, 0x020F, 0x030E, 0x050C, 0x060B, 0x0809, 0x0908,
  78.         0x0B06, 0x0C05, 0x0E03, 0x0F02, 0x0F00, 0x0F00, 0x0F20, 0x0E30, 0x0C50,
  79.         0x0B60, 0x0980, 0x0890, 0x06B0, 0x05C0, 0x03E0, 0x02F0, 0x00F2, 0x00E3,
  80.         0x00C5, 0x00B6, 0x0098, 0x006B, 0x005C, 0x003E, 0x002F, 0x020F, 0x030E,
  81.         0x050C, 0x060B, 0x0809, 0x0908, 0x0B06, 0x0C05, 0x0E03, 0x0F02, 0x0F00 };
  82.     UWORD    Table5[] = { 0, 0x0F20, 0x0E30, 0x0C50, 0x0B60, 0x0980, 0x0890, 0x06B0,
  83.         0x05C0, 0x03E0, 0x02F0, 0x00F2, 0x00E3, 0x00C5, 0x00B6, 0x0098, 0x006B,
  84.         0x005C, 0x003E, 0x002F, 0x020F, 0x030E, 0x050C, 0x060B, 0x0809, 0x0908,
  85.         0x0B06, 0x0C05, 0x0E03, 0x0F02, 0x0F00 };
  86.     UWORD    Table4[] = { 0, 0x0E03, 0x0B06, 0x0909, 0x060B, 0x030E, 0x003E, 0x006B,
  87.         0x0099, 0x00B6, 0x00E3, 0x03E0, 0x06B0,    0x0990, 0x0B60, 0x0E30 };
  88.     UWORD    Table3[] = { 0, 0x0E00, 0x0770, 0x00E0, 0x0077, 0x000E,    0x0707 };
  89.     UWORD    Table2[] = { 0, 0x0E00, 0x00E0, 0x000E };
  90.     UWORD    Table1[] = { 0, 0x0FFF };
  91.     UWORD    *Table[6];
  92.  
  93.     Table[0] = Table1; Table[1] = Table2; Table[2] = Table3; Table[3] = Table4;
  94.     Table[4] = Table5, Table[5] = Table6;
  95.     
  96.     LoadRGB4( &(Screen->ViewPort), Table[Screen->BitMap.Depth-1], numCols );
  97. }
  98.  
  99. VOID blank( VOID )
  100. {
  101.     struct    mPrefObject    *mP;
  102.     struct    Screen        *MoireScr;
  103.     struct     RastPort    *rp;
  104.  
  105.     ULONG    numCols, i, j, k, n, Trail, xSpeed, ySpeed;
  106.     WORD    Wid, Hei, **cx, **cy, *dx, *dy, nl;
  107.  
  108.     if( MoireWnd ) mP = &nP;
  109.     else mP = ( struct mPrefObject * )prefData;
  110.  
  111.     xSpeed = mP->xSpeed;
  112.     ySpeed = mP->ySpeed;
  113.     nl = mP->numLines;
  114.     Trail = mP->Trail;
  115.  
  116.     if(!( cx = AllocVec( nl * sizeof( WORD * ), MEMF_CLEAR ))) goto exit;
  117.     if(!( cy = AllocVec( nl * sizeof( WORD * ), MEMF_CLEAR ))) goto exit;
  118.     if(!( dx = AllocVec( nl * sizeof( WORD ), MEMF_CLEAR ))) goto exit;
  119.     if(!( dy = AllocVec( nl * sizeof( WORD ), MEMF_CLEAR ))) goto exit;
  120.  
  121.     if(!( MoireScr = OpenScreenTags( 0l, SA_DisplayID, Mode, SA_Depth, Depth, SA_Quiet, TRUE, SA_Behind, TRUE,
  122.         SA_Overscan, OSCAN_STANDARD, TAG_DONE ))) goto exit;
  123.  
  124.     rp = &( MoireScr->RastPort );
  125.     Wid = MoireScr->Width;
  126.     Hei = MoireScr->Height;
  127.  
  128.        numCols = (( 1 << rp->BitMap->Depth )-1)%3 ? ( 1 << rp->BitMap->Depth )-1 : ( 1 << rp->BitMap->Depth );
  129.  
  130.     if( numCols == 1 ) numCols = 2;
  131.  
  132.     for( k = 0; k < nl; k++ ) {
  133.         if(!( cx[k] = AllocVec( Trail * sizeof( UWORD ), MEMF_CLEAR ))) goto exit;
  134.         if(!( cy[k] = AllocVec( Trail * sizeof( UWORD ), MEMF_CLEAR ))) goto exit;
  135.     }
  136.  
  137.     SetRGB4( &(MoireScr->ViewPort), 0, 0, 0, 0 );
  138.  
  139.     switch( mP->Cycle ) {
  140.     case 0:
  141.         if( MoireScr->BitMap.Depth > 6 ) agaInit( MoireScr, numCols );
  142.         else ecsInit( MoireScr, numCols );
  143.         break;
  144.     case 1:
  145.         SetRGB4( &(MoireScr->ViewPort), 1, RangeRand( 14 ) + 1, RangeRand( 14 ) + 1, RangeRand( 14 ) + 1 );
  146.         break;
  147.         case 2:
  148.         SetRGB4( &(MoireScr->ViewPort), 1, 15, 15, 15 );
  149.         break;
  150.     case 3:
  151.         setCopperList( Hei, 1, &( MoireScr->ViewPort ));
  152.         break;
  153.     }
  154.         
  155.     for( k = 0; k < nl; k++ ) {
  156.         cx[k][1] = RangeRand( Wid - 2 ) + 1;
  157.         cy[k][1]= RangeRand( Hei - 2 ) + 1;
  158.         dx[k] = RangeRand( xSpeed ) + 1;
  159.         dy[k] = RangeRand( ySpeed ) + 1;
  160.     }
  161.     i = 0; j = 0;
  162.  
  163.     BlankMousePointer();
  164.     ScreenToFront( MoireScr );
  165.  
  166.     while(!(SetSignal(0,0) & SIGBREAKF_CTRL_C )) {
  167.  
  168.         WaitTOF();
  169.  
  170.         i = (i+1) % Trail;
  171.         n = (i+1) % Trail;
  172.         j = (j+1) % 255;
  173.  
  174.         if( !mP->Cycle ) SetAPen( rp, (j*(numCols-1))/255+1 );
  175.         else SetAPen( rp, 1 );
  176.  
  177.         for( k = 0; k < nl; k++ ) {
  178.             if( cx[k][i] >= Wid ) {
  179.                 dx[k] = -1 * RangeRand( xSpeed ) - 1;
  180.                 cx[k][i] = Wid-1;
  181.             } else if( cx[k][i] < 0 ) {
  182.                 dx[k] = RangeRand( xSpeed ) + 1;
  183.                 cx[k][i] = 0;
  184.             }
  185.             if( cy[k][i] >= Hei ) {
  186.                 dy[k] = -1 * RangeRand( ySpeed ) - 1;
  187.                 cy[k][i] = Hei-1;
  188.             } else if( cy[k][i] < 0 ) {
  189.                 dy[k] = RangeRand( ySpeed ) + 1;
  190.                 cy[k][i] = 0;
  191.             }
  192.         }
  193.  
  194.         Move( rp, cx[0][i], cy[0][i] );
  195.         for( k = 1; k < nl; k++ ) Draw( rp, cx[k][i], cy[k][i] );
  196.         if( nl > 2 ) Draw( rp, cx[0][i], cy[0][i] );
  197.  
  198.         SetAPen( rp, 0 );
  199.  
  200.         Move( rp, cx[0][n], cy[0][n] );
  201.         for( k = 1; k < nl; k++ ) Draw( rp, cx[k][n], cy[k][n] );
  202.         if( nl > 2 ) Draw( rp, cx[0][n], cy[0][n] );
  203.  
  204.         for( k = 0; k < nl; k++ ) {
  205.             cx[k][n] = cx[k][i] + dx[k];
  206.             cy[k][n] = cy[k][i] + dy[k];
  207.         }
  208.     }
  209.  
  210. exit:
  211.     SetSignal( 0L, SIGBREAKF_CTRL_C );
  212.  
  213.     if( cx ) {
  214.         for( k = 0; k < nl; k++ ) if( cx[k] ) FreeVec( cx[k] );
  215.         FreeVec( cx );
  216.     }
  217.     if( cy ) {
  218.         for( k = 0; k < nl; k++ ) if( cy[k] ) FreeVec( cy[k] );
  219.         FreeVec( cy );
  220.     }
  221.     if( dx ) FreeVec( dx );
  222.     if( dy ) FreeVec( dy );
  223.  
  224.     UnblankMousePointer();
  225.     if( MoireScr ) CloseScreen( MoireScr );
  226. }
  227.